<html>

<head>
  <meta charset="UTF-8">
  <title>数据清洗操作记录</title>
  <style>
    #app {
      width: 1000px;
      margin: 0 auto;
    }

    table,
    th,
    td {
      border: 1px solid #e0e0e0;
      border-collapse: collapse;
    }

    th,
    td {
      padding: 6px 10px;
      text-align: left;
    }

    th {
      background-color: #bfbfbf;
    }

    h1,
    h2,
    h3,
    h4,
    h5,
    h6 {
      color: #000;
      margin-top: 20px;
      margin-bottom: 10px;
    }

    body {
      font-family: "Microsoft YaHei", "SimSun", "Arial", sans-serif;
    }
  </style>
</head>

<body>
  <div id="app">
    <h1>检验鉴定原始记录</h1>
    <table style="width:100%; border:none; margin-bottom: 10px;">
      <tr>
        <td style="vertical-align:top; border:none;">
          <p>鉴定受理号：XXX</p>
          <p>检材编号：XXXX</p>
        </td>
        <td style="vertical-align:top; border:none;">
          <p>鉴定方法编号：GA/T XXXX</p>
          <p>检验人：AAA</p>
          <p>校核人：CCCC</p>
          <p>开始时间：202X年XX月XX日XX时XX分</p>
          <p>结束时间：202X年XX月XX日XX时XX分</p>
        </td>
      </tr>
    </table>
    <h2>一、检验环境</h2>
    <p>1、设备（编号）：110XXXX</p>
    <p>2、软件（版本）：XXXX软件（v3.2）</p>
    <h2>二、检验过程</h2>
    <h3>1.接受检材</h3>
    <p>XXX年XX月XX日, 接受委托单位XXXX送检光盘XX张，编为（时间+案件编号+检材类别+序号）号检材，正反面照片见图1。</p>
    <h4>检材明细列表如下：</h4>
    <table id="jc-detail-table">
      <thead>
        <tr>
          <th>序号</th>
          <th>检材编号</th>
          <th>检材名称</th>
          <th>数量</th>
          <th>外观</th>
          <th>类别</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>
    <h3>2.系统杀毒</h3>
    <p>启动编号为110XXXX的检验设备，XXX系统启动正常，用XXX杀毒软件对上述设备杀毒后，没有病毒。</p>
    <h3>3.检材读取</h3>
    <p>XXX年XX月XX分, 启动XXX软件系统对检材（检材编号XXXX）进行扫描，检材包含XXX个文件，包括xxx格式，其属性见下表（前10条），全量详情见附件001检材属性表。</p>
    <table id="jc-read-table">
      <thead>
        <tr>
          <th>检材序号</th>
          <th>检材文件名</th>
          <th>检材大小</th>
          <th>检材文件目录</th>
          <th>检材SHA256</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>
    <h3>4.检材保全备份</h3>
    <p>XXX年XX月XX分, XXX软件系统对检材（检材编号XXXX）进行保全备份，备份检材包含XXX个文件，包括xxx格式，其属性见下表（前10条），全量详情见附件002检材保全备份属性表。</p>
    <table id="jc-backup-table">
      <thead>
        <tr>
          <th>备份检材序号</th>
          <th>备份文件名</th>
          <th>备份检材大小</th>
          <th>备份文件目录</th>
          <th>备份检材SHA256</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>
    <p style="color: red;">以上保全备份的检材与原始检材文件数量、SH256值完全一致。</p>
    <h2>三、检材文件预检操作记录</h2>
    <h4>文件解密</h4>
    <p>检材XXXX中有XX个文件进行了加密，其中XX个文件自动获得了密码，XXX个文件需要委托方提供密码，详见下表：</p>
    <table id="jc-decrypt-table">
      <thead>
        <tr>
          <th>序号</th>
          <th>文件名</th>
          <th>文件格式</th>
          <th>检材目录</th>
          <th>能否解密</th>
          <th>密码</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>
    <h4>文件解压</h4>
    <p>检材XXXX中有XX个压缩文件，每个压缩文件包含的文件数量如下表（前10），详情见附件003检材压缩文件属性表：</p>
    <table id="jc-archive-table">
      <thead>
        <tr>
          <th>序号</th>
          <th>压缩文件名</th>
          <th>文件格式</th>
          <th>文件目录</th>
          <th>SHA256值</th>
          <th>包含文件数量</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>
    <h4>重复文件判断</h4>
    <p>系统根据哈希算法判断检材中文件的SHA256值是否相同，确定是否为重复文件，判定结果如下表（前10），详情见附件005检材重复文件列表。</p>
    <table id="jc-dup-table">
      <thead>
        <tr>
          <th>序号</th>
          <th>文件名</th>
          <th>文件格式</th>
          <th>检材目录</th>
          <th>SHA256</th>
          <th>重复文件数量</th>
          <th>重复文件名称（多个用，隔开）</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>
    <h4>无效文件识别</h4>
    <p>根据无效数据的认定规则，系统对无效文件进行分类识别，XX个文件字节数为0；XX个文件无法打开；XX个文件损坏；无效文件列表如下表（前10个），详情见附件006无效文件列表。</p>
    <table id="jc-invalid-table">
      <thead>
        <tr>
          <th>序号</th>
          <th>文件名</th>
          <th>文件格式</th>
          <th>检材目录</th>
          <th>无效原因</th>
          <th>文件大小</th>
          <th>标签</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>
    <h2>四、资金数据归并与格式转化</h2>
    <h4>资金数据归并</h4>
    <p>对待检的检材XX个文件进行相同字段要素项分类合并，发现匹配以下的资金数据模板结构和记录数。</p>
    <table id="jc-merge-table">
      <thead>
        <tr>
          <th>序号</th>
          <th>资金数据模板</th>
          <th>匹配文件数</th>
          <th>记录数</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>
    <h4>格式转化</h4>
    <p>XX软件对资金数据的时间、数值类型进行了规范化转化，结果如下表。</p>
    <table id="jc-format-table">
      <thead>
        <tr>
          <th>序号</th>
          <th>规则</th>
          <th>相关表</th>
          <th>记录数</th>
          <th>标记</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>
    <h2>五、资金数据清洗和标记</h2>
    <p>使用XX软件的资金数据清洗功能对资金数据进行清洗，发现以下的资金数据存在以下的一些异常。</p>
    <table id="jc-clean-table">
      <thead>
        <tr>
          <th>序号</th>
          <th>清洗规则</th>
          <th>相关表</th>
          <th>记录数</th>
          <th>标记</th>
          <th>标记的解释</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>
    <p>经过清洗操作，共清洗了XX无效数据，交易失败数据XX，冲正数据XXX条。</p>
    <h2>六、资金数据补全检验</h2>
    <p>
      发现XXX条的交易方的交易户名、交易证件号码缺失，XXX交易方的交易账户信息缺失，XX条交易对手的交易户名等信息缺失；采用账户信息进行补全，对XX条交易方的交易户名等信息进行了补全，对XX交易对手信息进行了补全。还有XX交易方的交易户名缺失。
    </p>
    <h2>七、资金数据重复性检验</h2>
    <p>使用XX软件的资金数据去重功能发现资金交易明细数据存在重复，重复信息如下表（前10），详细信息见附件重复数据明细表。</p>
    <table id="jc-dupcheck-table">
      <thead>
        <tr>
          <th>序号</th>
          <th>重复规则</th>
          <th>相关表</th>
          <th>重复条数</th>
          <th>标记</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>
    <h2>八、资金数据连续性检验</h2>
    <p>对资金交易数据进行完整性检验，发现XX账户不完整，具体如下表。</p>
    <table id="jc-integrity-table">
      <thead>
        <tr>
          <th>序号</th>
          <th>卡号</th>
          <th>账号</th>
          <th>期初数</th>
          <th>进账额度</th>
          <th>出账额度</th>
          <th>期末数</th>
          <th>净差（期初数+进帐金额-出账金额）</th>
          <th>完整性</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>
    <h2>九、交易数据汇总情况</h2>
    <p>
      通过以上对资金数据的清洗检验，检材XXXX，包含XXX文件，有效文件YYY个，归并到主体信息ZZZ条、账户信息AAA条，资金交易信息BBB条，清洗去重后的主体信息CCC条、账户信息DDD条，资金交易信息EEE条。对这些数据进行打包，形成附件xxx检材数据集.zip,其sha256校验值为xxxx10010019394。
    </p>
    <h2>十、检验异常情况记录</h2>
    <p>异常数据问题</p>
    <p>通过检验，发现异常的数据集包括以下内容，详细见附件XXX检材异常数据。</p>
    <table id="jc-exception-table">
      <thead>
        <tr>
          <th>序号</th>
          <th>清洗规则</th>
          <th>相关表</th>
          <th>记录数</th>
          <th>标记</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>
    <h3>鉴定意见及风险提示</h3>
    <p>本报告仅供参考，具体以实际数据为准。</p>
  </div>
  <script>
    // 通用渲染函数（只渲染tbody）
    function renderTableBody(tableId, columns, data) {
      const table = document.getElementById(tableId);
      const tbody = table.querySelector('tbody');
      let html = data.map(row => "<tr>" + columns.map(col => `<td>${row[col] ?? ""}</td>`).join("") + "</tr>").join("");
      tbody.innerHTML = html;
    }
    // 检材明细列表
    const jcDetailColumns = ["序号", "检材编号", "检材名称", "数量", "外观", "类别"];
    const jcDetailData = [
      { 序号: 1, 检材编号: "20250109-XXX-01-01", 检材名称: "XXX案件资金电子数据", 数量: 1, 外观: "完好", 类别: "光盘" }
    ];
    renderTableBody("jc-detail-table", jcDetailColumns, jcDetailData);
    // 检材读取
    const jcReadColumns = ["检材序号", "检材文件名", "检材大小", "检材文件目录", "检材SHA256"];
    const jcReadData = [
      { 检材序号: 1, 检材文件名: "Xxx文件", 检材大小: "", 检材文件目录: "XXX/xxx/xxx.xls", 检材SHA256: "32033r940239043209932099" }
    ];
    renderTableBody("jc-read-table", jcReadColumns, jcReadData);
    // 检材保全备份
    const jcBackupColumns = ["备份检材序号", "备份文件名", "备份检材大小", "备份文件目录", "备份检材SHA256"];
    const jcBackupData = [
      { 备份检材序号: 1, 备份文件名: "备份文件1", 备份检材大小: "10MB", 备份文件目录: "backup/xxx/", 备份检材SHA256: "abc123sha256" }
    ];
    renderTableBody("jc-backup-table", jcBackupColumns, jcBackupData);
    // 文件解密
    const jcDecryptColumns = ["序号", "文件名", "文件格式", "检材目录", "能否解密", "密码"];
    const jcDecryptData = [
      { 序号: 1, 文件名: "Rar、zip...", 文件格式: "能", 检材目录: "1234", 能否解密: "是", 密码: "1234" },
      { 序号: 2, 文件名: "Excel", 文件格式: "不能", 检材目录: "无密码", 能否解密: "否", 密码: "" }
    ];
    renderTableBody("jc-decrypt-table", jcDecryptColumns, jcDecryptData);
    // 文件解压
    const jcArchiveColumns = ["序号", "压缩文件名", "文件格式", "文件目录", "SHA256值", "包含文件数量"];
    const jcArchiveData = [
      { 序号: 1, 压缩文件名: "压缩包1.zip", 文件格式: "Zip", 文件目录: "/xxx/", SHA256值: "320432942", 包含文件数量: 20 }
    ];
    renderTableBody("jc-archive-table", jcArchiveColumns, jcArchiveData);
    // 重复文件判断
    const jcDupColumns = ["序号", "文件名", "文件格式", "检材目录", "SHA256", "重复文件数量", "重复文件名称（多个用，隔开）"];
    const jcDupData = [
      { 序号: 1, 文件名: "D:/案件数据大本营/xxx.xls", 文件格式: "Excel", 检材目录: "/xxx/", SHA256: "sha256xxxx", 重复文件数量: 2, "重复文件名称（多个用，隔开）": "xxx.xls, yyy.xls" }
    ];
    renderTableBody("jc-dup-table", jcDupColumns, jcDupData);
    // 无效文件识别
    const jcInvalidColumns = ["序号", "文件名", "文件格式", "检材目录", "无效原因", "文件大小", "标签"];
    const jcInvalidData = [
      { 序号: 1, 文件名: "Excel", 文件格式: "资金数据文件的大小字节数为0。", 检材目录: 0, 无效原因: "文件大小为0；无法打开；无法解压；解密失败；", 文件大小: "0B", 标签: "无效" }
    ];
    renderTableBody("jc-invalid-table", jcInvalidColumns, jcInvalidData);
    // 资金数据归并
    const jcMergeColumns = ["序号", "资金数据模板", "匹配文件数", "记录数"];
    const jcMergeData = [
      { 序号: 1, 资金数据模板: "主体信息表（联系信息、住址信息）", 匹配文件数: 10, 记录数: 1000 },
      { 序号: 2, 资金数据模板: "账户信息表", 匹配文件数: 20, 记录数: 20000 },
      { 序号: 3, 资金数据模板: "交易明细信息表", 匹配文件数: 30, 记录数: 1900000 }
    ];
    renderTableBody("jc-merge-table", jcMergeColumns, jcMergeData);
    // 格式转化
    const jcFormatColumns = ["序号", "规则", "相关表", "记录数", "标记"];
    const jcFormatData = [
      { 序号: 1, 规则: "去除字符两边空格", 相关表: "资金交易明细", 记录数: 1000, 标记: "已处理" },
      { 序号: 2, 规则: "时间转化YYYY-mm-dd hh:mm:ss", 相关表: "资金交易明细", 记录数: 1000, 标记: "已处理" },
      { 序号: 3, 规则: "金额数值转化", 相关表: "资金交易明细", 记录数: 1000, 标记: "已处理" }
    ];
    renderTableBody("jc-format-table", jcFormatColumns, jcFormatData);
    // 资金数据清洗和标记
    const jcCleanColumns = ["序号", "清洗规则", "相关表", "记录数", "标记", "标记的解释"];
    const jcCleanData = [
      { 序号: 1, 清洗规则: "交易时间为空", 相关表: "资金交易明细", 记录数: 1000, 标记: "无效数据", 标记的解释: "缺失时间" },
      { 序号: 2, 清洗规则: "交易金额为空", 相关表: "资金交易明细", 记录数: 1000, 标记: "无效数据", 标记的解释: "缺失金额" }
    ];
    renderTableBody("jc-clean-table", jcCleanColumns, jcCleanData);
    // 资金数据重复性检验
    const jcDupCheckColumns = ["序号", "重复规则", "相关表", "重复条数", "标记"];
    const jcDupCheckData = [
      { 序号: 1, 重复规则: "全字段相同", 相关表: "资金交易明细", 重复条数: 1000, 标记: "重复数据" },
      { 序号: 2, 重复规则: "核心字段相同", 相关表: "资金交易明细", 重复条数: 1000, 标记: "重复数据" }
    ];
    renderTableBody("jc-dupcheck-table", jcDupCheckColumns, jcDupCheckData);
    // 资金数据连续性检验
    const jcIntegrityColumns = ["序号", "卡号", "账号", "期初数", "进账额度", "出账额度", "期末数", "净差（期初数+进帐金额-出账金额）", "完整性"];
    const jcIntegrityData = [
      { 序号: 1, 卡号: "6222****", 账号: "1234567890", 期初数: 1000, 进账额度: 5000, 出账额度: 4000, 期末数: 2000, "净差（期初数+进帐金额-出账金额）": 2000, 完整性: "不完整" }
    ];
    renderTableBody("jc-integrity-table", jcIntegrityColumns, jcIntegrityData);
    // 检验异常情况记录
    const jcExceptionColumns = ["序号", "清洗规则", "相关表", "记录数", "标记"];
    const jcExceptionData = [
      { 序号: 1, 清洗规则: "交易时间为空", 相关表: "资金交易明细", 记录数: 1000, 标记: "无效数据" },
      { 序号: 2, 清洗规则: "交易金额为空", 相关表: "资金交易明细", 记录数: 1000, 标记: "无效数据" }
    ];
    renderTableBody("jc-exception-table", jcExceptionColumns, jcExceptionData);
    window.addEventListener('message', function (event) {
      // 这里只是简单打印，可以根据需要处理
      console.log('test.html 收到 message:', event.data);
    });
  </script>
</body>

</html>